package com.imooc.controller;

import com.google.gson.Gson;
import com.imooc.api.intercept.JWTCurrentUserInterceptor;
import com.imooc.base.BaseInfoProperties;
import com.imooc.grace.result.GraceJSONResult;
import com.imooc.pojo.Users;
import com.imooc.pojo.bo.ModifyUserBO;
import com.imooc.pojo.vo.UsersVO;
import com.imooc.service.UserService;
import com.imooc.utils.JWTUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author 啊昌
 * @date 2025/9/27 18:18
 * UserInfoController app端用户修改
 */
@RestController
@RequestMapping("userinfo")
@Slf4j
public class UserInfoController extends BaseInfoProperties {

	@Autowired
	private UserService userService;

	@Autowired
	private JWTUtils jwtUtils;



	/**
	 * 修改用户信息
	 * @param modifyUserBO 用户信息修改业务对象，包含要修改的用户信息
	 * @return GraceJSONResult 包含修改后的用户信息的JSON结果对象
	 */
	@PostMapping("modify")
	public GraceJSONResult modify(@RequestBody ModifyUserBO modifyUserBO) {
		// 调用服务层修改用户信息
		userService.modifyUserInfo(modifyUserBO);
		// 获取更新后的用户信息
		UsersVO userInfo = getUserInfo(modifyUserBO.getUserId(), true);
		return GraceJSONResult.ok(userInfo);
	}


	/**
	 * 根据用户ID获取用户信息
	 * @param userId 用户ID
	 * @return 包含用户信息的JSON结果
	 */
	@PostMapping("get")
	public GraceJSONResult get(@RequestParam("userId")String userId) {
		// 获取用户信息并返回成功结果
		return GraceJSONResult.ok(getUserInfo(userId, true));
	}


	/**
	 * 根据用户ID获取用户信息
	 *
	 * @param userId 用户ID
	 * @return 包含用户信息的JSON结果
	 */
	@PostMapping("freshUserInfo")
	public GraceJSONResult freshUserInfo(@RequestParam("userId") String userId) {
		// 获取用户信息并返回成功结果
		return GraceJSONResult.ok(getUserInfo(userId, true));
	}



	private UsersVO getUserInfo(String userId, boolean needJWT) {
		// 查询获得用户的最新信息
		Users latestUser = userService.getById(userId);

		UsersVO usersVO = new UsersVO();
		BeanUtils.copyProperties(latestUser, usersVO);

		if (needJWT) {
			// 重新生成并且覆盖原来的token
			String uToken = jwtUtils.createJWTWithPrefix(new Gson().toJson(latestUser),
					TOKEN_USER_PREFIX);
			usersVO.setUserToken(uToken);
		}

		return usersVO;
	}

}
